package com.bupt.ilink.controller;

import com.bupt.ilink.entity.ImageUploadRequest;
import com.bupt.ilink.service.OssService;
import com.bupt.ilink.utils.R;
import jakarta.servlet.http.HttpServletRequest;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@RestController
public class OssController {
    @Autowired
    private OssService ossService;

    //  批量上传到指定路径，path需要在MySQL中存好
    //  根据前端，可以在当前目录下，一次性上传多个文件
    //  文件命名，以id命名。

    @PostMapping("/multimodal/uploadBase64Images")//最后不加/
    public R uploadBase64images(@RequestBody ImageUploadRequest request) {
        return R.ok("上传成功", ossService.uploadBase64Images(request.getImages()));
    }

    @PostMapping("/uploadOssFile")//最后不加/
    public R uploadOssFile(@RequestParam("files") List<MultipartFile> files,
                           @RequestParam("path") String path) {
        List<String> successFiles = new ArrayList<>();
        List<String> failedFiles = new ArrayList<>();

        // 打印文件列表
        System.out.println("待上传的文件列表: ");
        for (MultipartFile file : files) {
            System.out.println(file.getOriginalFilename());
        }

        for (MultipartFile file : files) {
            if (ossService.uploadFile(file, path, file.getOriginalFilename())) {
                successFiles.add(file.getOriginalFilename());
            } else {
                failedFiles.add(file.getOriginalFilename());
            }
        }

        if (failedFiles.isEmpty()) {
            return R.ok("所有文件上传成功: " + String.join(", ", successFiles));
        } else if (successFiles.isEmpty()) {
            return R.failure("所有文件上传失败: " + String.join(", ", failedFiles));
        } else {
            return R.failure("部分文件上传成功，部分失败。\n成功的文件: " + String.join(", ", successFiles) + "\n失败的文件: " + String.join(", ", failedFiles));
        }
    }

    //  上传单个文件
    @PostMapping("/uploadSingleOssFile")
    public R uploadOssFile(@RequestParam("file") MultipartFile file,
                           @RequestParam("path") String path) {
        if (ossService.uploadFile(file, path, file.getOriginalFilename())) {
            return R.ok(file.getOriginalFilename()+"单个文件上传成功");
        }
        return R.failure(file.getOriginalFilename()+"单个文件上传失败");
    }

    //  objectName需要先从MySQL中根据名称查询id得到
    @GetMapping("/getOssFile")
    public R getOssFile(@RequestParam String objectName){
        String result = ossService.getFileUrl(objectName);
        if(result != null){
            return R.ok(result);
        }else{
            return R.failure("文件未找到"+objectName);
        }
    }

    //  创建目录--用户点击【新建文件】-MySQL更新的同时更新OSS
    //  目录需以正斜线结尾。
    @PostMapping("/createOssDirectory")
    public R createDirectory(@RequestBody String jsonString){
        JSONObject jsonObject = new JSONObject(jsonString);
        //  新建文件名，以斜线结尾
        String directory = jsonObject.getString("directory");
        System.out.println("创建目录："+directory);
        //  新建文件所在目录,以斜线结尾
        String path = jsonObject.getString("path");
        System.out.println("所在路径："+path);

        boolean result = ossService.createDirectory(directory, path);
        if (result) {
            return R.ok("目录创建成功");
        } else {
            return R.failure("目录创建失败");
        }
    }


    // 用户点击文件夹名称--MySQL查询对应path=prefix--根据此prefix返回该目录下，所有文件和子目录
    //  请注意，这些文件和子目录都是以id命名，所以还需要MySQL查询后返回
    //  列举指定目录下的所有文件和子目录
    @GetMapping("/listOssFiles")
    public List<String> listOssFiles(@RequestParam String prefix) {
        return ossService.listFiles(prefix);
    }

    //  删除单个文件
    @DeleteMapping("/deleteOssFile")//最后不加/
    public R deleteOssFile(@RequestParam String filename,@RequestParam String path) {
        boolean result = ossService.deleteFile(filename, path);
        if (result) {
            return R.ok(filename+"文件删除成功");
        } else {
            return R.failure(filename+"文件删除失败");
        }
    }

    // 删除目录及其内容  最后加/
    @DeleteMapping("/deleteOssDirectory")
    public R deleteOssDirectory(@RequestParam String directory) {
        boolean result = ossService.deleteDirectory(directory);
        if (result) {
            return R.ok("目录删除成功");
        } else {
            return R.failure("目录删除失败");
        }
    }

    //  改变文件位置
    @PostMapping("/moveOssFile")
    public R moveOssFile(@RequestBody String jsonString){
        JSONObject jsonObject = new JSONObject(jsonString);
        //  要移动的文件名，需要携带后缀
        String filename = jsonObject.getString("filename");
        //  原目录
        String ori_path = jsonObject.getString("ori_path");
        //  目标目录
        String tar_path = jsonObject.getString("tar_path");
        System.out.println(ori_path+"文件"+filename+"移动至"+tar_path);

        boolean result = ossService.moveFile(filename, ori_path, tar_path);
        if (result) {
            return R.ok("文件移动成功");
        } else {
            return R.failure("文件移动失败");
        }

    }

    @PostMapping("/uploadUrlOss")
    public R uploadUrlOss(@RequestBody String jsonString){
        JSONObject jsonObject = new JSONObject(jsonString);
        //  新建文件名，以斜线结尾
        String url = jsonObject.getString("url");
        String objectName = jsonObject.getString("objectName");

        boolean result = ossService.uploadUrl(url, objectName);
        if (result) {
            return R.ok("url直接上传成功");
        } else {
            return R.failure("url直接上传失败");
        }
    }
}
